package com.itany.corejava.code09_集合.list集合;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 石小俊
 * @date 2023年05月05日 10:35
 */
public class Test01_ArrayList {

    public static void main(String[] args) {
//        definedList();
//        listMethod();
//        listToArray();
        arrayToList();
    }

    public static void definedList() {
        // 创建一个初始容量为10ArrayList空集合
        // 此时的容量不是元素个数,此时集合是一个空集合,没有元素
        // 此时表示集合初始可以放10个元素,如果超出才会扩展容量
        // 可以通过泛型指定类型,如果没有指定类型,则默认为Object
        ArrayList list = new ArrayList();
        // size():获取当前集合中元素的个数
        System.out.println(list.size());
        // 添加元素
        list.add(1);
        list.add("admin");
        list.add(true);
        list.add(3.14);
        list.add('a');
        System.out.println(list.size());
        System.out.println(list);

        // 创建一个指定初始容量的空集合
        // 如果指定了集合类型,则集合中只能存放对应类型的数据
        ArrayList<String> list2 = new ArrayList<>(5);
        // 由于当前集合是String集合,集合中的元素只能是字符串
        // list2.add(1); // 报错
        list2.add("admin");
        list2.add("jack");
        System.out.println(list2.size());

        // 定义时还可以通过多态来定义
        // 该方式为主流方式,只是当必须使用ArrayList独有方法时才不用该方式
        List<Integer> list3 = new ArrayList<>();
        list3.add(1);

        // 通过Collection对象创建一个ArrayList集合
        List<String> list4 = new ArrayList<>(list);
        System.out.println(list4);
    }

    public static void listMethod() {
        ArrayList<String> list = new ArrayList<>();
        // size():返回集合中元素的数量
        System.out.println("集合中元素数量:" + list.size());
        // add():向集合的末尾添加指定元素,元素的顺序与放入的顺序一致
        list.add("jack");
        list.add("admin");
        list.add("alice");
        list.add("jack");
        list.add("admin");
        list.add("jack");
        list.add("admin");
        // 向集合中index索引位置添加指定元素t
        list.add(1, "tom");

        // 将集合中index索引位置的元素修改为t,并返回原有的元素值
        System.out.println(list.set(1, "lily"));

        // 移除集合中首次出现的指定元素。如果存在指定元素,移除后返回true,否则返回false。
        System.out.println(list.remove("jack"));
        System.out.println(list);

        // 移除集合中index索引位置的元素,并返回被移除的元素
        System.out.println(list.remove(2));

        List<Integer> nums = new ArrayList<>();
        nums.add(1);
        nums.add(3);
        nums.add(7);
        nums.add(5);
        nums.add(4);
        System.out.println(nums);
        // 当集合是一个Integer类型时
        // 直接写数字表示的是一个int类型的数据,则删除指定索引位置的元素
        nums.remove(3);
        // 如果要删除指定的元素,则通过手动装箱将一个数值通过Integer表示
        // 此时表示删除指定元素3
        nums.remove(new Integer(3));
        System.out.println(nums);
        // 返回index索引位置的元素
        System.out.println(list.get(2));

        // 返回指定元素在集合中第一次出现的索引位置。如果不存在,则返回-1
        System.out.println(list.indexOf("admin"));
        System.out.println(list.indexOf("alice"));

        // 返回指定元素在集合中最后一次出现的索引位置。如果不存在,则返回-1
        System.out.println(list.lastIndexOf("admin"));
        System.out.println(list.lastIndexOf("alice"));

        // 判断集合中是否存在指定元素t,返回boolean类型
        System.out.println(list.contains("admin"));
        System.out.println(list.contains("alice"));
        System.out.println(list);


        // 当集合中没有数据时,表示集合为空
        // 此时相当于list2.size() == 0
        // 打印集合,其结果不是null,而是一对中括号
        List<String> list2 = new ArrayList<>();
        System.out.println(list2);
        // 判断指定集合是否为空,返回boolean类型数据。相当于list2.size() == 0
        System.out.println(list2.isEmpty());
        System.out.println(list2.size() == 0);
    }

    public static void listToArray(){
        ArrayList list = new ArrayList<>();
        list.add("admin");
        list.add("alice");
        list.add("jack");
        list.add("tom");
        list.add(1);
        list.add(true);
        System.out.println(list);

        // 通过toArray方法,将ArrayList转换成数组
        Object[] arr = list.toArray();
        System.out.println(Arrays.toString(arr));
    }

    public static void arrayToList(){
        String[] arr = {"admin", "jack", "tom", "lily"};
        List<String> list = Arrays.asList(arr);
        System.out.println(list);
        List<Integer> list2 = Arrays.asList(1, 3, 11, 2, 5, 15, 6);
        System.out.println(list2);

        // 此时的对象的是ArrayList
        List<String> names = new ArrayList<>(Arrays.asList("admin", "lily", "tom"));
        // 此时删除成功
        names.remove("admin");
        System.out.println(names);

        // 此时的对象是List
        List<String> names2 = Arrays.asList("admin", "lily", "tom");
        // 此时报错,UnsupportedOperationException
        // 此时的names2并不是ArrayList,删除时会报错
        // 如果想要使用ArrayList的方法,必须创建的是ArrayList对象
        names2.remove("admin");
        System.out.println(names2);
    }
}
